這三天總共會介紹以下六種設計模式在 GenAI 的應用,今天進入到第三天:
設計模式 | 重點 | GenAI 應用 |
---|---|---|
單例模式 (Singleton) | 確保全局唯一實例 | LLM 模型初始化 |
工廠模式 (Factory Method) | 靈活創建對象 | 跨型態檔案讀取 |
觀察者模式 (Observer) | 實現事件驅動 | 資料庫更新觸發處理 |
模板模式 (Template Method) | 定義算法骨架 | 資料前處理流程框架 |
裝飾器模式 (Decorator) | 動態添加功能 | 靈活組合資料處理步驟 |
策略模式 (Strategy) | 動態切換算法 | 檢索策略調整 |
import string
from functools import wraps
def lowercase(func):
@wraps(func)
def wrapper(text):
return func(text).lower()
return wrapper
def remove_punctuation(func):
@wraps(func)
def wrapper(text):
return func(text).translate(str.maketrans("", "", string.punctuation))
return wrapper
def tokenize(func):
@wraps(func)
def wrapper(text):
return " ".join(func(text).split())
return wrapper
@tokenize
@remove_punctuation
@lowercase
def process_text(text: str) -> str:
return text
def main():
text = "Hello, World! This is an Example."
processed_text = process_text(text)
print(f"Original text: {text}")
print(f"Processed text: {processed_text}")
if __name__ == "__main__":
main()
lowercase
、remove_punctuation
和 tokenize
。每個裝飾器都封裝一個文本處理步驟。@wraps(func)
裝飾器用於保留原函數的元數據。process_text
函數使用了以上三個裝飾器,形成了一個處理流程:先轉小寫,然後移除標點符號,最後進行分詞。from abc import ABC, abstractmethod
class DatabaseRetrievalStrategy(ABC):
@abstractmethod
def retrieve(self, query: str) -> str:
pass
class SQLDatabaseStrategy(DatabaseRetrievalStrategy):
def retrieve(self, query: str) -> str:
return f"從 SQL 資料庫檢索:執行 SQL 查詢 '{query}'"
class NoSQLDatabaseStrategy(DatabaseRetrievalStrategy):
def retrieve(self, query: str) -> str:
return f"從 NoSQL 資料庫檢索:使用 key-value 查詢 '{query}'"
class InformationRetriever:
def __init__(self, strategy: DatabaseRetrievalStrategy):
self.strategy = strategy
def set_strategy(self, strategy: DatabaseRetrievalStrategy):
self.strategy = strategy
def search(self, query: str) -> str:
return self.strategy.retrieve(query)
# 使用範例
def main():
retriever = InformationRetriever(SQLDatabaseStrategy())
print(retriever.search("SELECT * FROM users")) # 使用 SQL 資料庫
retriever.set_strategy(NoSQLDatabaseStrategy())
print(retriever.search("user:123")) # 使用 NoSQL 資料庫
if __name__ == "__main__":
main()
DatabaseRetrievalStrategy
是一個抽象基類,定義了檢索策略的接口。SQLDatabaseStrategy
和 NoSQLDatabaseStrategy
是具體的策略類,實現了特定類型數據庫的檢索邏輯。InformationRetriever
類使用策略模式,可以動態設置和切換不同的檢索策略。InformationRetriever
來執行不同類型數據庫的檢索。設計模式的部份就告一個段落了。
ref.
Refactoring.Guru | design-patterns